package main.java.br.com.projeto.domain.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import main.java.br.com.projeto.domain.entity.Fornecedor;
import main.java.br.com.projeto.domain.entity.TipoPessoa;

public class DaoFornecedor extends Dao<Fornecedor>{

	/**
	 * 
	 */
	private static final long serialVersionUID = 4833044767765734540L;

	public DaoFornecedor() {
		super(Fornecedor.class);
	}
	
	public List<Fornecedor> listByFilterPJ(Long id, String filter, String filterDoc, TipoPessoa tipo) {
		String hql = "select fornecedor from Fornecedor fornecedor "
					+ "where ( lower(fornecedor.razaoSocial) like '%' || lower ( cast(:filter as string) ) || '%' or :filter = null ) "
					+ "and ( fornecedor.id = :id or :id = 0 ) "
					+ "and ( fornecedor.cnpj like '%' || cast(:filterDoc  as string) || '%' or :filterDoc = null ) "
					+ "and (fornecedor.tipoPessoa = :tipo)";

		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("filter", filter);
		parameters.put("id", id);
		parameters.put("filterDoc", filterDoc);
		parameters.put("tipo", tipo);

		return this.findOneResult(hql, parameters);
	}
	
	public List<Fornecedor> listByFilterPF(Long id, String filter, String filterDoc, TipoPessoa tipo) {
		String hql = "select fornecedor from Fornecedor fornecedor "
					+ "where ( lower(fornecedor.nome) like '%' || lower ( cast(:filter as string) ) || '%' or :filter = null) "
					+ "and ( fornecedor.id = :id or :id = 0 ) "
					+ "and ( fornecedor.cpf like '%' || cast(:filterDoc  as string) || '%' or :filterDoc = null) "
					+ "and (fornecedor.tipoPessoa = :tipo)";

		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("filter", filter);
		parameters.put("id", id);
		parameters.put("filterDoc", filterDoc);
		parameters.put("tipo", tipo);

		return this.findOneResult(hql, parameters);
	}
	
	public List<Fornecedor> listFornecedoresProdutos (Long produtoId) {
		String hql = "select fornecedor from Fornecedor fornecedor "
				+ "join fornecedor.produtos produtos "
				+ "where produtos.id = :produtoId";

		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("produtoId", produtoId);
		return this.findOneResult(hql, parameters);
	}
	
	public List<Fornecedor> listFornecedoresTipoPessoa(TipoPessoa tipo) {
		String hql = "select fornecedor from Fornecedor fornecedor "
				+ "where fornecedor.tipoPessoa = :tipo";
		
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("tipo", tipo);

		return this.findOneResult(hql, parameters);
	}
	
	public List<Fornecedor> listByFilter(Long id, String filter) {
		String hql = "select fornecedor from Fornecedor fornecedor "
					+ "where ( lower(fornecedor.nome) like '%' || lower ( cast(:filter as string) ) || '%' or :filter = null) "
					+ "and ( fornecedor.id = :id or :id = 0 ) ";

		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("filter", filter);
		parameters.put("id", id);

		return this.findOneResult(hql, parameters);
	}
	
	public List<Fornecedor> listFornecedoresByNome(String nome)
	{
		String hql = "select fornecedor from Fornecedor fornecedor "
				+ "where lower(fornecedor.nome) like '%' || lower ( cast(:nome as string) ) || '%'";

		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("nome", nome);
	
		return this.findOneResult(hql, parameters);
	}
}
